home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-12-02 | 3.3 KB | 154 lines | [TEXT/CWIE] |
- /*
- You may incorporate this Apple sample source code into your program(s) without
- restriction. This Apple sample source code has been provided "AS IS" and the
- responsibility for its operation is yours. You are not permitted to redistribute
- this Apple sample source code as "Apple sample source code" after having made
- changes. If you're going to re-distribute the source, we require that you make
- it clear in the source that the code was descended from Apple sample source
- code, but that you've made changes.
- */
-
- #include "ScriptableStuffItEngine.h"
-
- #ifndef __StuffItLib__
- # include "StuffItEngineLib.h"
- #endif
-
- #ifndef __ALIASES__
- # include <Aliases.h>
- #endif
-
- #ifndef __ERRORS__
- # include <Errors.h>
- #endif
-
- static pascal OSErr ReplyToStuff (const FSSpec *actualArchive, AppleEvent *reply)
- {
- OSErr err = noErr;
-
- AliasHandle aliasH = nil;
-
- if (!(err = NewAliasMinimal (actualArchive,&aliasH)))
- {
- HLockHi (Handle (aliasH));
- Size handleSize = GetHandleSize (Handle (aliasH));
- err = AEPutParamPtr (reply,keyDirectObject,typeAlias,*aliasH,handleSize);
- DisposeHandle (Handle (aliasH));
- }
-
- return err;
- }
-
- static pascal OSErr GetFilesToStuff (const AppleEvent *ae, FSSpecArrayHandle *stuffItArrayH)
- {
- AEDescList listToStuff;
- OSErr err = AEGetParamDesc (ae,keyDirectObject,typeAEList,&listToStuff);
-
- if (!err)
- {
- OSErr err2;
-
- *stuffItArrayH = NewFSSpecList ( );
-
- if (!*stuffItArrayH)
- err = memFullErr;
- else
- {
- long index;
-
- err = AECountItems (&listToStuff,&index);
-
- if (!err) while (index)
- {
- FSSpec fss;
- AEKeyword keyWord;
- DescType typeCode;
- Size actualSize;
-
- err = AEGetNthPtr
- (&listToStuff,index,typeFSS,&keyWord,&typeCode,&fss,sizeof(fss),&actualSize);
- if (err) break;
- err = AddToFSSpecList (&fss,*stuffItArrayH);
- if (err) break;
- --index;
- }
-
- if (err)
- {
- DisposeFSSpecList (*stuffItArrayH);
- *stuffItArrayH = nil;
- }
- }
-
- err2 = AEDisposeDesc (&listToStuff);
- if (!err) err = err2;
- }
-
- return err;
- }
-
- static pascal OSErr GetRequestedArchive (const AppleEvent *ae, FSSpecPtr *fssP)
- {
- OSErr err = noErr;
-
- *fssP = FSSpecPtr (NewPtr (sizeof (**fssP)));
-
- if (!*fssP)
- err = MemError ( );
- else
- {
- DescType actualType;
- Size actualSize;
-
- err = AEGetParamPtr (ae,keyTargetAlias,typeFSS,&actualType,*fssP,
- sizeof (**fssP),&actualSize);
-
- if (err)
- {
- DisposePtr (Ptr (*fssP));
- *fssP = nil;
-
- if (err == errAEDescNotFound)
- err = noErr;
- }
- }
-
- return err;
- }
-
- pascal OSErr Stuff (const AppleEvent *ae, AppleEvent *reply, long magicCookie)
- {
- FSSpecArrayHandle stuffItArrayH;
- OSErr err = GetFilesToStuff (ae,&stuffItArrayH);
-
- if (!err)
- {
- FSSpecPtr requestedArchive = nil;
-
- if (!(err = GetRequestedArchive (ae,&requestedArchive)))
- {
- Boolean deleteOriginals = false;
-
- if (!(err = GetOptionalBoolean (ae,&deleteOriginals,keyDeleteOriginals)))
- {
- FSSpec actualArchive;
-
- err = StuffFSList (magicCookie,stuffItArrayH,requestedArchive,
- &actualArchive,true,deleteOriginals,false,false,true,kStuffConflictPrompt);
-
- if (!err)
- err = ReplyToStuff (&actualArchive, reply);
- else if (err == -1) // why don't they return userCanceledErr?
- err = userCanceledErr;
- }
-
- if (requestedArchive)
- DisposePtr (Ptr (requestedArchive));
- }
-
- DisposeFSSpecList (stuffItArrayH);
- }
-
- return err;
- }
-